package reflect;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 定义注解时，也会使用java自带的注解来修饰当前注解，常用的两个:
 * @Target 用于指定当前注解可以在哪里使用。该注解需要传入一个参数，
 *         这个参数是ElementType的枚举类型。
 *         例如:ElementType.METHOD表示当前注解只用于方法
 *             ElementType.TYPE表示当前注解只用于类
 * @Retention 用于指定当前注解在哪里保留，有三个可选项
 *            RetentionPolicy.SOURCE:仅在源码中保留
 *            RetentionPolicy.CLASS:保留在编译后的字节码文件中，但是
 *                                  反射无法获取到
 *            RetentionPolicy.RUNTIME:保留在字节码文件中，可被反射
 *                                  机制使用(常用)
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoRun {
    /*
        如果注解中只有一个参数，那么通常这个参数的名字就应当定义为value
        这样一来，外面在使用这个注解时为其传参可以写为:
        @AutoRun(10)
        此时value的值就是10

        如果注解只有一个参数，但是参数名不使用value,而是定义了其他名字,
        比如:int sum();
        那么使用注解并传参时的写法为:
        @AutoRun(sum=10)
        此时sum的值为10
        由此可见,如果只有一个参数时,若名字为value时,使用注解传递参数是可以
        忽略参数名的.如果不叫value则必须指定参数名.

        default可以为参数定义默认值,这样以来外界在使用当前注解时若
        不为该参数指定值时就使用该默认值.
        例如:
        @AutoRun(10)   value的值为10
        @AutoRun       value使用默认值1
     */
    int value() default 1;//定义一个int型的参数value
}
